package com.bjsxt;

import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 测试懒汉式单例模式(如何防止反射和反序列化漏洞)
 *
 * @author lichunlong
 */
public class SingletonDemo06 implements Serializable {

    private static final long serialVersionUID = -6148220364208591293L;

    /**
     * 类初始化时，不初始化这个对象（延时加载，真正用的时候再创建）
     */
    private static SingletonDemo06 INSTANCE;

    /**
     * 私有化构造器
     */
    private SingletonDemo06() {
        if (INSTANCE != null) {
            throw new RuntimeException("单例模式-防反射异常处理");
        }
    }

    /**
     * 方法同步，调用效率低！
     */
    public static synchronized SingletonDemo06 getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new SingletonDemo06();
        }
        return INSTANCE;
    }

    /**
     * 反序列化时，如果定义了readResolve()则直接返回此方法指定的对象。而不需要单独再创建新对象！
     */
    private Object readResolve() throws ObjectStreamException {
        return INSTANCE;
    }

}
